﻿/*****************************************************************//**
 *
 * @file   FITKAbaqusAdaptorPart.h
 * @brief  Abaqus Part 适配器 用于读取和写出HDF5过程中的Part。
 * @author fulipeng (flipengqd@yeah.net)
 * @date   2024-05-28
 *
 *********************************************************************/
#ifndef __FITKABAQUSHDF5ADAPTORPART__H__
#define __FITKABAQUSHDF5ADAPTORPART__H__

#include "FITKAbaqusIOHDF5API.h"
#include "FITKAbaqusHDF5AbstractAdaptor.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"
#include "FITK_Interface/FITKInterfaceIOHDF5/FITKInterfaceHDF5AdaptorMesh.h"

 //前置声明
ForwardDeclarNS(AbaqusData, FITKAbaqusPart)
ForwardDeclarNS(AbaqusData, FITKDataCase)
ForwardDeclarNS(Interface, FITKAbaAbastractSection)
ForwardDeclarNS(Interface, FITKSectionAssign)
ForwardDeclarNS(Interface, FITKModelSet)
ForwardDeclarNS(Interface, FITKMeshSurface)
ForwardDeclarNS(Interface, FITKComponentManager)
ForwardDeclarNS(Interface, FITKCoordinateSystem)
ForwardDeclarNS(Interface, FITKAbaMaterialOrientation)
ForwardDeclarNS(Interface, FITKAbaAbstractInertia)
ForwardDeclarNS(Interface, FITKAbaBeamOrientation)

namespace IO
{
    /**
     * @brief HDF5 Part 读写适配器
     * @author fulipeng (fulipengqd@yeah.net)
     * @date 2024-05-28
     */
    class FITKABAQUSIOHDF5API FITKAbaqusHDF5AdaptorPart : public FITKInterfaceHDF5AdaptorMesh
    {
    public:
        explicit FITKAbaqusHDF5AdaptorPart() = default;
        ~FITKAbaqusHDF5AdaptorPart() = default;

        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-28
         */
        QString getAdaptorClass() override;

        /**
         * @brief 设置算例数据对象
         * @param caseData
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-28
         */
        void setCaseData(AbaqusData::FITKDataCase* caseData);

        /**
         * @brief 适配器读取
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-28
         */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-28
         */
        bool adaptW() override;

    private:


        /**
         * @brief 读取节点
         * @param partData 当前写出的part
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-18
         */
        bool readNode(AbaqusData::FITKAbaqusPart* partData, H5::Group& h5Group);

        /**
         * @brief 读取单元
         * @param partData 当前写出的part
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-18
         */
        bool readElement(AbaqusData::FITKAbaqusPart* partData, H5::Group& h5Group);

        /**
         * @brief 读取集合和表面
         * @param partData 当前写出的part
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-28
         */
        bool readSetSurf(AbaqusData::FITKAbaqusPart* partData, H5::Group& h5Group);

        /**
         * @brief 写出set 包含点集、单元集
         * @param set set数据
         * @param compManager set管理器
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-28
         */
        bool readSet(Interface::FITKModelSet* set, Interface::FITKComponentManager* compManager, H5::Group& h5Group);

        /**
         * @brief 读取surface
         * @param surface surface数据
         * @param h5Group
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-28
         */
        bool readSurface(Interface::FITKMeshSurface* surface, H5::Group& h5Group);

        /**
         * @brief 读取sectonAssign的数据
         * @param sectionAssign 当前写出的截面指派
         * @return 状态 true 成功 false 失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-05
         */
        bool readSectionAssign(int sectionType, H5::Group& h5Group);

        /**
         * @brief 读取CoordinateSystem的数据
         * @param h5Group
         * @return 状态 true 成功 false 失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool readCoordinateSystem(H5::Group& h5Group);

        /**
         * @brief 读取MaterialOrientation(材料方向)数据
         * @param h5Group
         * @return 状态 true 成功 false 失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool readMaterialOrientation(H5::Group & h5Group);

        /**
         * @brief 读取Inertia(惯量)数据
         * @param h5Group
         * @return 状态 true 成功 false 失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool readInertia(H5::Group & h5Group);

        /**
         * @brief 读取 梁方向 数据
         * @param beamO 梁方向
         * @return 状态 true 成功 false 失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-07-05
         */
        bool readBeamOrientation(H5::Group & h5Group);

        /**
         * @brief 写出节点
         * @param partData 当前写出的part
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-18
         */
        bool writeNode(AbaqusData::FITKAbaqusPart* partData, H5::Group& h5Group);

        /**
         * @brief 写出单元
         * @param partData 当前写出的part
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-18
         */
        bool writeElement(AbaqusData::FITKAbaqusPart* partData, H5::Group& h5Group);

        /**
         * @brief 写出集合和表面
         * @param partData 当前写出的part
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-28
         */
        bool writeSetSurf(AbaqusData::FITKAbaqusPart* partData, H5::Group& h5Group);

        /**
         * @brief 写出set 包含点集、单元集
         * @param set set数据
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-28
         */
        bool writeSet(Interface::FITKModelSet* set, H5::Group& h5Group);

        /**
         * @brief 写出surface
         * @param partData 当前写出的part
         * @param surface surface数据
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-28
         */
        bool writeSurface(AbaqusData::FITKAbaqusPart* partData, Interface::FITKMeshSurface* surface, H5::Group& h5Group);

        /**
         * @brief 写出sectonAssign的数据
         * @param sectionAssign 当前写出的截面指派
         * @return 状态 true 成功 false 失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-05
         */
        bool writeSectionAssign(Interface::FITKSectionAssign * sectionAssign, H5::Group& h5Group);

        /**
         * @brief 写出CoordinateSystem的数据
         * @param coordinateSystem 坐标系
         * @return 状态 true 成功 false 失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-20
         */
        bool writeCoordinateSystem(Interface::FITKCoordinateSystem* coordinateSystem, H5::Group& h5Group);

        /**
         * @brief 写出MaterialOrientation(材料方向)数据
         * @param coordinateSystem 坐标系
         * @return 状态 true 成功 false 失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-20
         */
        bool writeMaterialOrientation(Interface::FITKAbaMaterialOrientation* materialOrientation, H5::Group & h5Group);

        /**
         * @brief 写出Inertia(惯量)数据
         * @param inertia 惯量
         * @return 状态 true 成功 false 失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-20
         */
        bool writeInertia(Interface::FITKAbaAbstractInertia* inertia, H5::Group & h5Group);

        /**
         * @brief 写出 梁方向 数据
         * @param beamO 梁方向
         * @return 状态 true 成功 false 失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-07-05
         */
        bool writeBeamOrientation(Interface::FITKAbaBeamOrientation* beamO, H5::Group & h5Group);

        /**
         * @brief 提取单元信息 网格类型有变化需要在子类中重写
         * @param mesh 网格数据
         * @return 提取后的信息
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-03
         */
        virtual QMultiHash<QString, int> extractElementInformation(Interface::FITKUnstructuredMesh* mesh) override;


    private:

        /**
         * @brief 部件数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-28
         */
        AbaqusData::FITKAbaqusPart* _partData{};
    };

    Register2FITKIOAdaptorFactory(HDF5, AbaqusData::FITKAbaqusPart, FITKAbaqusHDF5AdaptorPart)

}

#endif